from rest_framework import serializers
from .models import OAUser,UserStatusChoices,OADepartment
from rest_framework import exceptions

class LoginSerializer(serializers.Serializer):
    email = serializers.EmailField(required=True)
    password = serializers.CharField(max_length=20,min_length=5)

    '''
    attrs 是一个子字典，它包含了当前被验证字段的数据, 当 LoginSerializer 处理请求数据的时候 DRF 会自动将客户端请求的数据 映射到序列化器的字段中
    然后 这些字段会作为 attrs 字典的一部分传递到 validate 方法中
    '''
    def validate(self, attrs):
        email = attrs.get('email')
        password = attrs.get('password')
        ## 判空
        if email and password:
            ## 插叙用户输入邮箱是否存在
            user = OAUser.objects.filter(email=email).first()
            if not user:
                raise serializers.ValidationError('该邮箱不存在请重新输入')
            if not user.check_password(password):                   ## 判断密码
                raise serializers.ValidationError('密码输入错误！')
            ## 判断状态
            if user.status == UserStatusChoices.UNACTIVED:
                raise serializers.ValidationError('该用户未激活')
            if user.status == UserStatusChoices.LOCKED:
                raise serializers.ValidationError("该用户被锁定 请联系管理员处理")
            ###把 User 存在 attrs 中, 目的是节省 SQL 语句执行的次数
            attrs['user'] = user
        else:
            raise serializers.ValidationError('请输入邮箱或者密码')
        return attrs

## 序列化的嵌套 返回 department 信息
'''
serializers.ModelSerializer  可以 自动序列化 自定义定义的 Django 模型 
1、ModelSerializer  会自动根据模型的字段定义 来创建序列化器的字段 如果你的模型中 有 CharField、IntegerField、ForeignKey 等字段 , 
    ModelSerializer 会自动为这些字段生成对应的序列化字段
    
2、生成 Meta 类
ModelSerializer 需要你在类中定义一个 Meta 类 并指定与之关联的 Django 模型和要序列化的字段

'''
class DepartmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = OADepartment
        fields ="__all__"


'''
通过 model 中的 FK 实现嵌套序列化
当你 序列化 OAUSER 数据的时候 DRF 会自动根据 OAUser 实例中的外键 department 查找对应的 OADepartment 实例
然后 他会调用 DepartmentSerializer 来序列化该 OADepartment 实例的字段 生成嵌套的部门信息
'''
## USER 序列化
class UserSerializer(serializers.ModelSerializer):
    department = DepartmentSerializer()
    class Meta:
        model = OAUser
        exclude = ("password","groups","user_permissions")

## 重置密码 定义前端要传递的参数
class ResetPwdSerializer(serializers.Serializer):
    oldpwd = serializers.CharField(min_length=5,max_length=20)
    pwd1 = serializers.CharField(min_length=5,max_length=20)
    pwd2 = serializers.CharField(min_length=5,max_length=20)

    ## 校验传递的密码是否合法
    def validate(self, attrs):
        print(f"=============attrs is : {attrs}")
        oldPwd = attrs.get('oldpwd')
        pwd1 = attrs.get('pwd1')
        pwd2 = attrs.get('pwd2')
        user = self.context["request"].user
        print(f"=======user: {user}")
        if not user.check_password(oldPwd):
            raise exceptions.ValidationError("旧密码输入错误")
        if pwd1 != pwd2:
            raise exceptions.ValidationError("两次输入迭代密码不一致")
        return attrs

